<?php
/**
 * 验证码类
 */
class Code
{	
	// 定义变量
	
	// 图片的宽度
	public $width = 100;
	// 图片的高度
	public $height = 30;
	//背景颜色
	public $bgColor = '#dc22ad';
	//文字颜色
	public $textColor = '#333333';
	//文字的大小
	public $textSize = 16;
	//字体文件
	public $fontFile = 'font.ttf';
	// 图像资源
	public $img;
	// 验证码种子
	public $str = 'iygeuinxhbvgieynvbcmzaqpoweldkfjhygngikewsazo8769237401234765908769876542';
	//验证码的数量
	public $len = 5;
	// 最终提取验证码字符
	public $code;
	// 画布颜色
	public $color;

	/**
	 * [构造函数 description]
	 */
	public function __construct()
	{
		
	}


	//总流方法程集
	public function show(){
		//①：创建画布方法
		$this->createImg();
		//② 获取验证码字符串
		$this->setCodeStr();
		//③ 向图片中写入验证码字符串
		$this->createText();
		//画干扰线
		$this->createLine();
		// 输出图片
		header('Content-type:image/png');
		imagepng($this->img);
		
	}

	/**
	 * [①：创建画布]
	 * @return [type] [description]
	 */
	private function createImg(){
		// 设置画布大小
		$this->img = imagecreatetruecolor($this->width, $this->height);
		// 设置颜色
		$color = $this->getColor($this->bgColor);
		// 填充画布
		imagefill($this->img, 0, 0, $color);
		// 给图片加边框
		$lineColor = $this->getColor('#aaaaaa');
		//加空心矩形边框
		imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $lineColor);
		
	}
	
	/**
	 * [③ ：向图片中写入验证码文字]
	 * @return [type] [description]
	 */
	private function createText(){
		
		// 设置文字颜色
		$color = $this->getColor($this->textColor);
		// 平均分布每个字的宽度
		$w = $this->width/$this->len;

		// 循环写入文字
		for($i=0;$i<$this->len;$i++)
		{
		imagettftext($this->img, $this->textSize, 
			mt_rand(-20,20), $w*$i+5, 20+mt_rand(0,10), $color, $this->fontFile, $this->code[$i]);
		}

	}

	/**
	 * [④ 画干扰线]
	 * @return [type] [description]
	 */
	private function createLine(){
		// 干扰线颜色
		$color = $this->getColor($this->textColor);
		// 画线 取随机画线
		for ($i=0; $i < 5; $i++) { 

			imageline($this->img, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
			
		}

		// 画点  取随机的像素点
		for ($i=0; $i < 30; $i++) { 
			imagesetpixel($this->img, mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
		}

	}

	/**
	 * [ ② 获取验证码字符串]
	 */
	private function setCodeStr(){

		// 创建一个空验证码
		$code = '';

		//循环获取验证码 把每次获得的验证码 连接在一起
		for ($i=0; $i < $this->len ; $i++) { 
			$pos = mt_rand(0,strlen($this->str)-1);
			$code.=$this->str[$pos];
		}
		// 把验证码转换成大写
		$this->code = strtoupper($code);

	}

	// ① 颜色统一调用颜色资源
	/**
	 * [①获取颜色对象]
	 * @param  [type] $color [16进制色值]
	 * @return [type]        [description]
	 */
	private function getColor($color){
	//去除所有的二进制颜色如#dc22ad的#号建
	//#dc22ad  取十六进制
	$red = hexdec(substr($color, 1,2));
	$green = hexdec(substr($color, 3,2));
	$blue = hexdec(substr($color, 5,2));
	// 把设置的颜色返回
	return imagecolorallocate($this->img, $red, $green, $blue);

	}

}


?>